/**
 * 返回所有子路由
 */
import { RouteRecordRaw } from "vue-router";
import path from 'path-browserify';
import { Store } from '../../typings/store';
 function getChildRoutes (routes:RouteRecordRaw[]) {
   const result:any[] = []
   routes.forEach(router => {
     if (router.children && router.children.length > 0) {
       result.push(...router.children)
     }
   })
   return result
 }
 /**
  * 处理脱离层级的路由：某个一级路由为其他子路由，则剔除该一级路由，保留路由层级
  * @param {*} routes router.getRoutes()
  */
 export const filterChildRoutes = (routes:RouteRecordRaw[]) => {
   // 从获取到的路由列表中，去除，包含children的路由。
   const childrenList = getChildRoutes(routes)
   // 获取到所有的子路由，然后在路由类表比对，过滤，得到想要的列表
   return routes.filter(router => {
     return !childrenList.find((childRouter:any) => {
       return childRouter.path === router.path
     })
   })
 }
 /**
  * 判断数据是否为空值
  */
 function isNull (data:any) {
   if (!data) return true
   if (JSON.stringify(data) === '{}') return true
   if (JSON.stringify(data) === '[]') return true
   return false
 }
 /**
  * 根据 routes 数据，返回对应 menu 规则数组
  */
 export const generateMenus = (routes:RouteRecordRaw[], basePath = '') => {
   const result:any[] = []
   // 遍历路由表
   routes.forEach(item => {
     // 如果没有children, 没有meta，需要排除掉
     if (isNull(item.children) && isNull(item.meta)) return
     // 存在 children 不存在 meta，进入迭代
     if (isNull(item.meta) && !isNull(item.children)) {
       result.push(...generateMenus(item.children!))
       return
     }
     // 合并 path 作为跳转路径
     const routePath = path.resolve(basePath, item.path)
     // 路由分离之后，存在同名父路由的情况，需要单独处理
     let route:any = result.find((item:any) => item.path === routePath)
     if (!route) {
       route = {
         ...item,
         path: routePath,
         children: []
       }
       // icon 与 title 必须全部存在
       if (route.meta.icon && route.meta.title) {
         // meta 存在生成 route 对象，放入 arr
         result.push(route)
       }
     }
     // 存在 children 进入迭代到children
     if (item.children) {
       route.children.push(...generateMenus(item.children, route.path))
     }
   })
   return result
}


// 过滤路由
export const getFilterRoutes = (targetRoutes:RouteRecordRaw[], menus:Store.Menus[]) => {
  const filterRoutes:RouteRecordRaw[] = []
  menus.forEach(item => {
      const target = targetRoutes.find(target => target.meta?.title === item.menuName)
      if (target) {
          // 将children子路由信息单独取出来
     // 剩下的部分全部属于一级路由，通过...rest收集起来
          const { children: targetChildren, ...rest } = target
          // 将...rest中的数据直接添加到路由对象中
          const route:any = {
              ...rest,
          }
          if (item.subMenus) {
              // 递归遍历
              route.children = getFilterRoutes(targetChildren as RouteRecordRaw[], item.subMenus)
          }
          filterRoutes.push(route)
      }
  })
  return filterRoutes;
}